An array header is identical in form to a G-Vector. At present, the following subtype codes are defined: 0 Normal. 1 Array is displaced to another array (which may be simple). The entries in the header-vector are interpreted as follows:
1 Number of Elements
This is a fixnum indicating the number of elements for
which there is space in the data vector.
2 Fill Pointer
This is a fixnum indicating how many elements of the data
vector are actually considered to be in use. Normally this is initialized to
the same value as the Number of Elements field, but in some array applications
it will be given a smaller value. Any access beyond the fill pointer is
illegal.
3 Displacement
This fixnum value is added to the final code-vector index
after the index arithmetic is done but before the access occurs. Used for
mapping a portion of one array into another. For most arrays, this is 0.
4 Range of First Index
This is the number of index values along the first
dimension, or one greater than the largest legal value of this index (since the
arrays are always zero-based). A fixnum in the range 0 to 224-1. If any
of the indices has a range of 0, the array is legal but will contain no data
and accesses to it will always be out of range. In a 0-dimension array, this
entry will not be present.
5 - N Ranges of Subsequent Dimensions
The number of dimensions of an array can be determined by looking at the length of the array header. The rank will be this number minus 6. The maximum array rank is 65535 - 6, or 65529.
The ranges of all indices are checked on every access, during the conversion to a single data-vector index. In this conversion, each index is added to the accumulating total, then the total is multiplied by the range of the following dimension, the next index is added in, and so on. In other words, if the data vector is scanned linearly, the last array index is the one that varies most rapidly, then the index before it, and so on.